﻿Imports PTIC_Util
Imports PTIC_Util.GestionCalculs
Imports System.Runtime.Serialization


Namespace Comptes

    ''' <summary>
    ''' Représente le Bilan
    ''' </summary>
    ''' <remarks></remarks>
    Public Class Bilan_V2
        Inherits CalculCompose
        Implements ISerializable


        Private _parametresEntree As Parametres

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Friend Sub New()
            MyBase.New()
            _resultats = New ResultatsBilan
        End Sub

        ''' <summary>
        ''' Données initiales utilisées pour faire les calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Property ParametresEntree() As Parametres
            Get
                Return _parametresEntree
            End Get
            Friend Set(ByVal value As Parametres)
                _parametresEntree = value
            End Set
        End Property

        ''' <summary>
        ''' Résultats des calculs
        ''' </summary>
        ''' <value></value>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Overloads ReadOnly Property Resultats() As ResultatsBilan
            Get
                Return _resultats
            End Get
        End Property

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Protected Overrides Sub procedureCalcul()

            Dim resultatsCalcul As New ResultatsBilan

            With _parametresEntree

                ReDim resultatsCalcul.provisionsTechniquesBrutes(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.capitalSocialNonLibere(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.placements(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.capitalSocialOuv(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.apportSolvabilite(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.resultatN_1(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.apportResultatNeg(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.passifsSubordonnes(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.totalActif(.nbAnneesProjetees - 1)
                ReDim resultatsCalcul.totalPassif(.nbAnneesProjetees - 1)

                For i = 1 To .nbAnneesProjetees
                    resultatsCalcul.provisionsTechniquesBrutes(i - 1) = .provisionsTechniquesBrutes(i - 1)
                    'Capital social ouverture
                    If i = 1 Then resultatsCalcul.capitalSocialOuv(i - 1) = 0 Else resultatsCalcul.capitalSocialOuv(i - 1) = resultatsCalcul.capitalSocialOuv(i - 2) + resultatsCalcul.apportSolvabilite(i - 2)
                    'Apport pour satisfaire le besoin de marge
                    If i = 1 Then
                        resultatsCalcul.apportSolvabilite(i - 1) = .capitauxAlloues(i - 1) * (1 - .txCouvertureTSDI)
                    Else
                        resultatsCalcul.apportSolvabilite(i - 1) = (.capitauxAlloues(i - 1) * (1 - .txCouvertureTSDI)) _
                                                              - resultatsCalcul.capitalSocialOuv(i - 1)
                    End If
                    'Résultat de l'exercice N-1
                    If i = 1 Then resultatsCalcul.resultatN_1(i - 1) = 0 Else resultatsCalcul.resultatN_1(i - 1) = .resultat(i - 2)
                    'Apport destiné à compenser un résultat négatif (et touours garantir les besoins en fonds propres)
                    If i = 1 Then
                        resultatsCalcul.apportResultatNeg(i - 1) = 0
                    Else
                        resultatsCalcul.apportResultatNeg(i - 1) = IIf(.resultat(i - 2) < 0, -.resultat(i - 2), 0)
                    End If
                    'Passifs subordonnés
                    resultatsCalcul.passifsSubordonnes(i - 1) = .capitauxAlloues(i - 1) * .txCouvertureTSDI
                    'Totaux actif et passif
                    resultatsCalcul.totalActif(i - 1) = resultatsCalcul.capitalSocialOuv(i - 1) _
                                               + resultatsCalcul.apportSolvabilite(i - 1) _
                                               + resultatsCalcul.resultatN_1(i - 1) _
                                               + resultatsCalcul.apportResultatNeg(i - 1) _
                                               + resultatsCalcul.passifsSubordonnes(i - 1) _
                                               + resultatsCalcul.provisionsTechniquesBrutes(i - 1)
                    'Ajouter les provisions techiques ouverture
                    resultatsCalcul.totalPassif(i - 1) = resultatsCalcul.totalActif(i - 1)
                    'Capital social non libéré
                    resultatsCalcul.capitalSocialNonLibere(i - 1) = 0
                    'Placements
                    resultatsCalcul.placements(i - 1) = resultatsCalcul.totalActif(i - 1)
                Next
            End With
            _resultats = resultatsCalcul
        End Sub

        ''' <summary>
        ''' Parametre utilisé pour calculer le bilan
        ''' </summary>
        ''' <remarks></remarks>
        Public Class Parametres

            ''' <summary>
            ''' Taux de couverture des emprunts subordonnés à durée indéterminés
            ''' </summary>
            ''' <remarks></remarks>
            Public Property TxCouvertureTSDI As Double

            ''' <summary>
            ''' Représente les capitaux alloués
            ''' </summary>
            ''' <remarks></remarks>
            Public Property CapitauxAlloues As Double()

            ''' <summary>
            ''' Représente le résultat
            ''' </summary>
            ''' <remarks></remarks>
            Public Property Resultat As Double()

            ''' <summary>
            ''' Représente les provisions techniques brutes
            ''' </summary>
            ''' <remarks></remarks>
            Public Property ProvisionsTechniquesBrutes As Double()

            ''' <summary>
            ''' Représente le nombre d'années de projection
            ''' </summary>
            ''' <remarks></remarks>
            Public Property NbAnneesProjetees As Integer
        End Class

    ''' <summary>
    ''' Résultat des calculs du Bilan
    ''' </summary>
    ''' <remarks></remarks>
    Public Class ResultatsBilan
        'Création des tableaux attendus en sortie du compte

        ''' <summary>
        '''Représente les provisions techniques brutes
        ''' </summary>
        ''' <remarks></remarks>
        Public Property ProvisionsTechniquesBrutes As Double()

        ''' <summary>
        ''' Représente le capital social non libéré
        ''' </summary>
        ''' <remarks></remarks>
        Public Property CapitalSocialNonLibere As Double()

        ''' <summary>
        ''' Représente les placements
        ''' </summary>
        ''' <remarks></remarks>
        Public Property Placements As Double()

        ''' <summary>
        ''' Représente le capital social dans un uunivers ouvert
        ''' </summary>
        ''' <remarks></remarks>
        Public Property CapitalSocialOuv As Double()

        ''' <summary>
        ''' Représente l'apport à la marge de solvabilité
        ''' </summary>
        ''' <remarks></remarks>
        Public Property ApportSolvabilite As Double()

        ''' <summary>
        ''' Représente le résultat de l'exercice précédent
        ''' </summary>
        ''' <remarks></remarks>
        Public Property ResultatN_1 As Double()

        ''' <summary>
        ''' Représente l' apport au résultat
        ''' </summary>
        ''' <remarks></remarks>
        Public Property ApportResultatNeg As Double()

        ''' <summary>
        ''' Représente les passifs subordonnés
        ''' </summary>
        ''' <remarks></remarks>
        Public Property PassifsSubordonnes As Double()

        ''' <summary>
        ''' Représente le total de l'actif
        ''' </summary>
        ''' <remarks></remarks>
        Public Property TotalActif As Double()

        ''' <summary>
        ''' Représente le total du passif
        ''' </summary>
        ''' <remarks></remarks>
        Public Property TotalPassif As Double()

        ''' <summary>
        ''' Fait une copie des données
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Copy() As ResultatsBilan
            Dim result As New ResultatsBilan
            Dim provisionsTechniquesBrutes_copy(ProvisionsTechniquesBrutes.Count - 1) As Double
            Dim capitalSocialNonLibere_copy(CapitalSocialNonLibere.Count - 1) As Double
            Dim placements_copy(Placements.Count - 1) As Double
            Dim capitalSocialOuv_copy(CapitalSocialOuv.Count - 1) As Double
            Dim apportSolvabilite_copy(ApportSolvabilite.Count - 1) As Double
            Dim resultatN_1_copy(ResultatN_1.Count - 1) As Double
            Dim apportResultatNeg_copy(ApportResultatNeg.Count - 1) As Double
            Dim passifsSubordonnes_copy(PassifsSubordonnes.Count - 1) As Double
            Dim totalActif_copy(TotalActif.Count - 1) As Double
            Dim totalPassif_copy(TotalPassif.Count - 1) As Double

            For i = 0 To ProvisionsTechniquesBrutes.Count - 1
                provisionsTechniquesBrutes_copy(i) = ProvisionsTechniquesBrutes(i)
                capitalSocialNonLibere_copy(i) = CapitalSocialNonLibere(i)
                placements_copy(i) = Placements(i)
                capitalSocialOuv_copy(i) = CapitalSocialOuv(i)
                apportSolvabilite_copy(i) = ApportSolvabilite(i)
                resultatN_1_copy(i) = ResultatN_1(i)
                apportResultatNeg_copy(i) = ApportResultatNeg(i)
                passifsSubordonnes_copy(i) = PassifsSubordonnes(i)
                totalActif_copy(i) = TotalActif(i)
                totalPassif_copy(i) = TotalPassif(i)
            Next
            result.ProvisionsTechniquesBrutes = provisionsTechniquesBrutes_copy
            result.CapitalSocialNonLibere = capitalSocialNonLibere_copy
            result.Placements = placements_copy
            result.CapitalSocialOuv = capitalSocialOuv_copy
            result.ApportSolvabilite = apportSolvabilite_copy
            result.ResultatN_1 = resultatN_1_copy
            result.ApportResultatNeg = apportResultatNeg_copy
            result.PassifsSubordonnes = passifsSubordonnes_copy
            result.TotalActif = totalActif_copy
            result.TotalPassif = totalPassif_copy

            Return result
        End Function
    End Class

        ''' <summary>
        ''' 
        ''' </summary>
        ''' <remarks></remarks>
        Private Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData

        End Sub
    End Class
End Namespace